from django.urls import path
from django.conf.urls import url
from demo import views
from demo.viewsets import *
from rest_framework.routers import DefaultRouter, SimpleRouter

urlpatterns = [
    # 1 Django原生，DefaultViews
    url(r'^book/$', DefalutViews.BookListView.as_view()),  # 列表视图
    url(r'^book/(?P<pk>\d+)/$', DefalutViews.BookDetailView.as_view()),  # 详情视图

    # 2 Django原生+序列化方法
    url(r'^bookser/$', DefaultSerializersViews.BookSerializerListView.as_view()),
    url(r'^bookser/(?P<pk>\d+)/$', DefaultSerializersViews.BookSerializerDetailView.as_view()),

    # 3 APIView视图
    url(r'^bookapi/$', APIViews.BookListAPIView.as_view()),
    url(r'^bookapi/(?P<pk>\d+)/$', APIViews.BookDetailAPIView.as_view()),

    # 4 GenericAPIView相关的视图
    url(r'^bookgen/$', GenericAPIViews.BookListGenericAPIView.as_view()),
    url(r'^bookgen/(?P<pk>\d+)/$', GenericAPIViews.BookDetailGenericAPIView.as_view()),

    url(r'^bookmix/$', GenericAPIViews.BookListMixinView.as_view()),
    url(r'^bookmix/(?P<pk>\d+)/$', GenericAPIViews.BookDetailMixinView.as_view()),

    url(r'^bookall/$', GenericAPIViews.BookListListCreateView.as_view()),
    url(r'^bookall/(?P<pk>\d+)/$', GenericAPIViews.BookDetailRetrieveUpdateDestroyView.as_view()),

    # 5 视图集 ViewSet
    url(r'^bookview/$', ViewSet.BookViewSet.as_view({'get': 'list'})),
    url(r'^bookview/(?P<pk>\d+)/$', ViewSet.BookViewSet.as_view({'get': 'retrieve'})),

    # 6 列表视图路由 GenericViewSet
    url(r'^bookgenericview/$', ViewSet.BookGenericViewSet.as_view({'get': 'list'})),
    url(r'^bookgenericview/(?P<pk>\d+)/$', ViewSet.BookGenericViewSet.as_view({'get': 'retrieve'})),

    # 重写标准HTTP Method
    url(r'^bookendgenericview/$', ViewSet.BookEndGenericViewSet.as_view({'get': 'list', 'post': 'create'})),
    url(r'^bookendgenericview/(?P<pk>\d+)/$',
        ViewSet.BookEndGenericViewSet.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),

    # 定义除标准HTTP Method外的其他方法
    # 如果在CRUD之外额外增加的行为，应该单独定义路由
    # 如果此行为不需要pk，那么它就是列表视图，但是列表视图只有list，create，所以必须做映射
    url(r'^bookendgenericview/lastbook/$', views.BookEndGenericViewSet.as_view({'get': 'lastbook'})),
    url(r'^bookendgenericview/(?P<pk>\d+)/editbook/$', views.BookEndGenericViewSet.as_view({'put': 'editbook'})),

]


# 最后路由可以优化为：
# 创建路由器，路由器只能结合视图集一起使用

"""
生成默认路由器，当然还有SimpleRouter()，区别是默认路由器会生成一个根路由。

生成完路由器后，还需要注册路由。路由器只能注册http的标准方法，list，create，update，destroy，retrieve，如果是自定义方法，需要在视图函数中进行装饰器注册

basename的参数可以不指定，它默认会找到视图集中queryset属性所指定的查询集对应模型的小写作为路由别名前缀，如果没有设置queryset，就必须给basename参数传递。
"""
router = DefaultRouter()
# 注册路由，路由器只能注册http的标准方法，list，create，update，destroy，retrieve
# 如果是自定义方法，需要在视图函数中进行装饰器注册
router.register(r'drfbook', views.BookSerializerView)
router.register(r'drfuser', views.UserSerializerView)
# 把生成的好的路由，拼接到urlpatterns中
urlpatterns += router.urls
